home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / DMAKE38B.ARJ / FIND.C < prev    next >
C/C++ Source or Header  |  1992-01-23  |  2KB  |  131 lines

  1. /*
  2.     Directory Access Library
  3.  
  4.            FIND.C taken from DIRLIB.C by M. J. Weinstein
  5.          Released to public domain 1-Jan-89
  6.  
  7.     The author may be contacted at: 
  8.     matt@cs.ucla.edu -or- POB 84524, L.A., CA  90073
  9.  
  10.     Modified by dvadura@watdragon.edu to work with dmake.
  11.     (nuked the DOS version 2 code, since dmake needs version
  12.     3.0 or greater to function).
  13.  */
  14.  
  15.  
  16. /*
  17.  * revision history:
  18.  *
  19.  *    VER    MM/DD/YY    COMMENTS
  20.  *    ----    --------    --------
  21.  *    0.99    02/24/86    Beta release to INTERNET
  22.  */
  23.  
  24. #include <stdlib.h>
  25. #include <ctype.h>
  26. #include <errno.h>
  27. #include <string.h>
  28. #include <alloc.h>
  29. #include <dos.h>
  30. #include "dirlib.h"
  31.  
  32. #ifndef MK_FP
  33. #define MK_FP(seg,ofs)    ((void far *) \
  34.                (((unsigned long)(seg) << 16) | (unsigned)(ofs)))
  35. #endif
  36. #ifndef FP_SEG
  37. #define FP_SEG(fp)    ((unsigned)((unsigned long)(fp) >> 16))
  38. #endif
  39. #ifndef FP_OFF
  40. #define FP_OFF(fp)    ((unsigned)(fp))
  41. #endif
  42.  
  43. int              _err;
  44. static DTA far *_getsetdta ANSI((DTA far *));
  45.  
  46. /*
  47.  * get/set dta address
  48.  */
  49.  
  50. static DTA far *
  51. _getsetdta(newdta)
  52. DTA far *newdta;
  53. {
  54.     DTA far *olddta;
  55.     union REGS r;
  56.     struct SREGS s;
  57.  
  58.     /* get old dta */         
  59.     r.h.ah = 0x2f;
  60.     intdos(&r, &r);
  61.     segread(&s);
  62.     olddta = (DTA far *) MK_FP(s.es, r.x.bx);
  63.  
  64.     /* conditionally set new dta */
  65.     if (newdta) {
  66.         r.h.ah = 0x1a;
  67.         s.ds    = FP_SEG(newdta);
  68.         r.x.dx    = FP_OFF(newdta);    
  69.         intdosx(&r, &r, &s);
  70.     }
  71.  
  72.     return olddta;
  73. }
  74.  
  75. /*
  76.  * dos findfirst
  77.  */
  78.  
  79. DTA *
  80. findfirst(name, dta)
  81. char *name;
  82. DTA  *dta;
  83. {
  84.     union REGS r;  
  85.     struct SREGS s;
  86.     DTA far *dtasave;
  87.     char far *nmp = (char far *)name;
  88.  
  89.     dtasave = _getsetdta((DTA far *)dta);
  90.     
  91.     /* do directory lookup */
  92.     segread(&s);
  93.     r.h.ah    = 0x4e;
  94.     r.x.cx    = 0x10;
  95.     r.x.dx    = FP_OFF(nmp);
  96.     s.ds    = FP_SEG(nmp);
  97.     intdosx(&r, &r, &s);
  98.     /* restore dta */
  99.     _getsetdta(dtasave);
  100.     _err = r.x.ax;
  101.     if (r.x.cflag)
  102.         return (DTA *) 0;
  103.  
  104.     return dta;
  105. }
  106.  
  107. /*
  108.  * dos findnext
  109.  */
  110.  
  111. DTA *
  112. findnext(dta)
  113. DTA *dta;
  114. {
  115.     union REGS r;  
  116.     DTA far *dtasave;
  117.  
  118.     dtasave = _getsetdta((DTA far *)dta);
  119.  
  120.     /* do directory lookup */
  121.     r.h.ah = 0x4f;
  122.     intdos(&r, &r);
  123.     /* restore old dta */
  124.     _getsetdta(dtasave);
  125.     _err = r.x.ax;
  126.     if (r.x.cflag)
  127.         return (DTA *) 0;
  128.  
  129.     return dta;
  130. }
  131.